home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / interp / tclStruct1.2.tar.gz / tclStruct1.2.tar / tclStruct1.2 / stInit.c < prev    next >
C/C++ Source or Header  |  1995-09-12  |  5KB  |  167 lines

  1. /*
  2.  *    tclStruct package
  3.  *  Support 'C' structures in Tcl
  4.  *
  5.  *  Written by Matthew Costello
  6.  *  (c) 1995 AT&T Global Information Solutions, Dayton Ohio USA
  7.  *
  8.  *  See the file "license.terms" for information on usage and
  9.  *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  */
  11. #include "stInternal.h"
  12. #include "patchlevel.h"
  13. STRUCT_SCCSID("@(#)tclStruct:stInit.c    1.2    95/09/12")
  14.  
  15. /*
  16.  * Struct_Init : initialize package
  17.  */
  18. int
  19. Struct_Init(interp)
  20.   Tcl_Interp *interp; /* The current Tcl interpreter */
  21. {
  22.     Struct_PkgInfo_t *cdata = (Struct_PkgInfo_t *)ckalloc(sizeof(Struct_PkgInfo_t));
  23.     int v;
  24.     int endian;
  25.  
  26.     /*  Initialize the Package Info structure.  */
  27.     if (cdata == NULL) {
  28.     Tcl_AppendResult(interp,"can't allocate TclStruct package info", (char *)NULL );
  29.     return TCL_ERROR;
  30.     }
  31.     memset( (char *)cdata, 0x00, sizeof(Struct_PkgInfo_t) );
  32.  
  33.     /* Create the hash table for the named types. */
  34.     Tcl_InitHashTable(Struct_TypeHash(cdata),TCL_STRING_KEYS);
  35.  
  36.     Tcl_CreateCommand(interp,"struct_typedef",Struct_TypeDefCmd,
  37.               (ClientData)cdata,NULL);
  38.     Tcl_CreateCommand(interp,"struct_untypedef",Struct_UnTypeDefCmd,
  39.               (ClientData)cdata,NULL);
  40.     Tcl_CreateCommand(interp,"struct_new",Struct_NewCmd,
  41.               (ClientData)cdata,NULL);
  42.     Tcl_CreateCommand(interp,"struct_info",Struct_InfoCmd,
  43.               (ClientData)cdata,NULL);
  44.  
  45.     Tcl_CreateCommand(interp,"struct_copy",Struct_CopyCmd,
  46.               (ClientData)cdata,NULL);
  47.     Tcl_CreateCommand(interp,"struct_read",Struct_ReadCmd,
  48.               (ClientData)cdata,NULL);
  49.     Tcl_CreateCommand(interp,"struct_write",Struct_WriteCmd,
  50.               (ClientData)cdata,NULL);
  51.  
  52.     /*  Should the default numeric types be big-endian or little endian?
  53.      */
  54.     v = 1;
  55.     switch (*(char *)&v) {
  56.     case 0:    /* Big endian */
  57.         endian = STRUCT_FLAG_USE_ENDIAN|STRUCT_FLAG_BIG_ENDIAN;
  58.         break;
  59.     case 1:    /* Little endian */
  60.         endian = STRUCT_FLAG_USE_ENDIAN;
  61.         break;
  62.     default:
  63.         endian = 0;
  64.     }
  65.     /*
  66.      * Register defined types.
  67.      */ 
  68. # define STRUCT_FLAG_SIGNED    0
  69. # define STRUCT_FLAG_NUMERIC    \
  70.         STRUCT_FLAG_USE_STRICT|STRUCT_FLAG_USE_NULLOK|STRUCT_FLAG_USE_SIGN| \
  71.         STRUCT_FLAG_ALIGN_SIZE|STRUCT_FLAG_STRICT|STRUCT_FLAG_NULL_OK
  72.     if (Struct_RegisterBuiltInType(cdata, interp,
  73.         "char", sizeof(char),
  74.         STRUCT_FLAG_USE_STRICT|STRUCT_FLAG_USE_NULLOK|
  75.         STRUCT_FLAG_TRACE_ARRAY|STRUCT_FLAG_STRICT|STRUCT_FLAG_NULL_OK,
  76.         Struct_TraceChar) == TCL_ERROR)
  77.     return TCL_ERROR;
  78.     if (Struct_RegisterBuiltInType(cdata, interp,
  79.         "byte", sizeof(char),
  80.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_SIGNED|endian,
  81.         Struct_TraceInt) == TCL_ERROR)
  82.     return TCL_ERROR;
  83.     if (Struct_RegisterBuiltInType(cdata, interp,
  84.         "ubyte", sizeof(unsigned char),
  85.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_UNSIGNED|endian,
  86.         Struct_TraceInt) == TCL_ERROR)
  87.     return TCL_ERROR;
  88.     if (Struct_RegisterBuiltInType(cdata, interp,
  89.         "short", sizeof(short),
  90.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_SIGNED|endian,
  91.         Struct_TraceInt) == TCL_ERROR)
  92.     return TCL_ERROR;
  93.     if (Struct_RegisterBuiltInType(cdata, interp,
  94.         "ushort", sizeof(unsigned short),
  95.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_UNSIGNED|endian,
  96.         Struct_TraceInt) == TCL_ERROR)
  97.     return TCL_ERROR;
  98.     if (Struct_RegisterBuiltInType(cdata, interp,
  99.         "int", sizeof(int),
  100.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_SIGNED|endian,
  101.         Struct_TraceInt) == TCL_ERROR)
  102.     return TCL_ERROR;
  103.     if (Struct_RegisterBuiltInType(cdata, interp,
  104.         "uint", sizeof(unsigned int),
  105.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_UNSIGNED|endian,
  106.         Struct_TraceInt) == TCL_ERROR)
  107.     return TCL_ERROR;
  108.     if (Struct_RegisterBuiltInType(cdata, interp,
  109.         "long", sizeof(long),
  110.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_SIGNED|endian,
  111.         Struct_TraceInt) == TCL_ERROR)
  112.     return TCL_ERROR;
  113.     if (Struct_RegisterBuiltInType(cdata, interp,
  114.         "ulong", sizeof(unsigned long),
  115.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_UNSIGNED|endian,
  116.         Struct_TraceInt) == TCL_ERROR)
  117.     return TCL_ERROR;
  118.     if (Struct_RegisterBuiltInType(cdata, interp,
  119.         "float", sizeof(float),
  120.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_SIGNED,
  121.         Struct_TraceFloat) == TCL_ERROR)
  122.     return TCL_ERROR;
  123.     if (Struct_RegisterBuiltInType(cdata, interp,
  124.         "double", sizeof(double),
  125.         STRUCT_FLAG_NUMERIC|STRUCT_FLAG_SIGNED,
  126.         Struct_TraceDouble) == TCL_ERROR)
  127.     return TCL_ERROR;
  128.  
  129.     if (Struct_RegisterBuiltInType(cdata, interp,
  130.         "hex", sizeof(char),
  131.         STRUCT_FLAG_USE_STRICT|
  132.         STRUCT_FLAG_TRACE_ARRAY|STRUCT_FLAG_STRICT,
  133.         Struct_TraceHex) == TCL_ERROR)
  134.     return TCL_ERROR;
  135.     if (Struct_RegisterBuiltInType(cdata, interp,
  136.         "str", sizeof(char *),
  137.         STRUCT_FLAG_USE_STRICT|STRUCT_FLAG_USE_NULLOK|
  138.         STRUCT_FLAG_ALIGN_SIZE|STRUCT_FLAG_STRICT|STRUCT_FLAG_NULL_OK,
  139.         Struct_TraceString) == TCL_ERROR)
  140.     return TCL_ERROR;
  141.  
  142.     /*  Set up variables.  */
  143.     Tcl_SetVar(interp, "struct_version", STRUCT_VERSION, TCL_GLOBAL_ONLY);
  144.     Tcl_SetVar(interp, "struct_patchLevel", STRUCT_PATCH_LEVEL,
  145.         TCL_GLOBAL_ONLY);
  146.  
  147.     return TCL_OK;
  148. }
  149.  
  150.  
  151. /*
  152.  *  Retrieve the tclStruct package's ClientData pointer.
  153.  *  This is needed because certain external functions require
  154.  *  this pointer.
  155.  */
  156. ClientData
  157. Struct_GetClientData(interp)
  158.   Tcl_Interp *interp;
  159. {
  160.     Tcl_CmdInfo infobuf;
  161.     if (Tcl_GetCommandInfo(interp,"struct_typedef", &infobuf) &&
  162.     infobuf.clientData != NULL) {
  163.         return infobuf.clientData;
  164.     }
  165.     return NULL;
  166. }
  167.